原始题目:剑指 Offer 04. 二维数组中的查找 (opens new window)
解题思路:
因为题目中说明了每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。因此对于数组中的某个数字 ,如果 比 小,说明 在 上方。如果 比 搭,说明 在 的右方。
为了方便描述,将一个二维数组的四条边分为上下左右四个方向。
算法流程:
- 从二维数组 的左下方开始遍历,索引设置为 ,并与目标值 比较大小。
- 如果 等于 ,那么直接返回 。
- 如果 大于 ,说明 在 的上方,那么 。
- 如果 小于 ,说明 在 的右方,那么 。
- 如果遍历完之后,没有返回,则找不到 ,返回 。
代码:
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0) {
return false;
}
int i = matrix.length - 1;
int j = 0;
while (i >= 0 && j < matrix[0].length) {
if (matrix[i][j] == target) {
return true;
}
if (matrix[i][j] > target) {
i--;
} else {
j++;
}
}
return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
复杂度分析
时间复杂度:其中, 和 是矩阵的行数和列数,此算法最多循环 次。
空间复杂度:使用常数级的空间。
← 03.数组中重复的数字 05.替换空格 →